﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using l1cs.server.model.Instance;
using l1cs.server.model;
using l1cs.server.serverpackets;
using l1cs.server.datatables;

namespace l1cs.server.clientpackets
{
    public class C_Rank : ClientBasePacket
    {
        private const String _C_RANK = "[C] C_Rank";
        private static Logger _log = Logger.getLogger( typeof( C_Rank ).FullName );

        public C_Rank( byte[] abyte0, ClientThread clientthread )
            : base( abyte0 )
        {

            int data = readC(); // ?
            int rank = readC();
            String name = readS();

            L1PcInstance pc = clientthread.getActiveChar();
            L1PcInstance targetPc = L1World.getInstance().getPlayer( name );

            if ( pc == null )
            {
                return;
            }

            L1Clan clan = L1World.getInstance().getClan( pc.getClanname() );
            if ( clan == null )
            {
                return;
            }

            if ( rank < 1 && 3 < rank )
            {
                // ランクを変更する人の名前とランクを入力してください。[ランク=ガーディアン、一般、見習い]
                pc.sendPackets( new S_ServerMessage( 781 ) );
                return;
            }

            if ( pc.isCrown() )
            { // 君主
                if ( pc.getId() != clan.getLeaderId() )
                { // 血盟主
                    pc.sendPackets( new S_ServerMessage( 785 ) ); // あなたはもう君主ではありません。
                    return;
                }
            }
            else
            {
                pc.sendPackets( new S_ServerMessage( 518 ) ); // この命令は血盟の君主のみが利用できます。
                return;
            }

            if ( targetPc != null )
            { // オンライン中
                if ( pc.getClanid() == targetPc.getClanid() )
                { // 同じクラン
                    targetPc.setClanRank( rank );
                    targetPc.save(); // DBにキャラクター情報を書き込む
                    String rankString = "$772";
                    if ( rank == L1Clan.CLAN_RANK_PROBATION )
                    {
                        rankString = "$774";
                    }
                    else if ( rank == L1Clan.CLAN_RANK_PUBLIC )
                    {
                        rankString = "$773";
                    }
                    else if ( rank == L1Clan.CLAN_RANK_GUARDIAN )
                    {
                        rankString = "$772";
                    }
                    targetPc.sendPackets( new S_ServerMessage( 784, rankString ) ); // あなたのランクが%sに変更されました。
                }
                else
                {
                    pc.sendPackets( new S_ServerMessage( 414 ) ); // 同じ血盟員ではありません。
                    return;
                }
            }
            else
            { // オフライン中
                L1PcInstance restorePc = CharacterTable.getInstance()
                        .restoreCharacter( name );
                if ( restorePc != null
                        && restorePc.getClanid() == pc.getClanid() )
                { // 同じクラン
                    restorePc.setClanRank( rank );
                    restorePc.save(); // DBにキャラクター情報を書き込む
                }
                else
                {
                    pc.sendPackets( new S_ServerMessage( 109, name ) ); // %0という名前の人はいません。
                    return;
                }
            }
        }

        override
        public String getType()
        {
            return _C_RANK;
        }
    }
}